#include <iostream>
using namespace std;
#include "stdlib.h"
#include "Lienzo.h"
#include "UtilidadesSVG.h"
#include <sstream>

Lienzo::Lienzo(string a, float nx,float ny):titulo(a),ancho(nx),alto(ny){};

Lienzo::~Lienzo()
{
	for (int i = figuras.size()-1; i >=0; i--)
	{
		if(figuras.size()>=0)
		{
			delete figuras[i];
		}
	}
	figuras.clear();
}

istream& operator>>(istream& is,Lienzo& l)
{
	//en la nueva version solo tiene que leer y procesar la linea, despues ya llamara a quien haga falta;
	string t;
	float an;
	float al;
	string cad="";
	
	is>>an;//ancho
	is>>al;//alto
	getline(is,t);//titulo

	l.titulo=t;
	l.ancho=an;
	l.alto=al;
	//si hay una sola figura y despues una accion hacer mover no funciona

	while (!is.eof())
	{
		cad="";
		is>>cad;//con cad decides en funcion de la cadena si es circulo, rectangulo o hacer;
/*		if (cad=="")
		{
			getline(is, cad);
			is>>cad;
		}*/
		
		try
		{
			if (cad=="Circulo")
			{
				cad="";
				IDibujable* fig=UtilidadesSVG::crearFigura("Circulo",is);										
				l.figuras.push_back(fig);
			}
			else if(cad=="Rectangulo")
			{
				cad="";
				IDibujable* fig=UtilidadesSVG::crearFigura("Rectangulo",is);										
				l.figuras.push_back(fig);
			}
			else if(cad=="HACER")
			{
				cad="";
				UtilidadesSVG::hacerOperacion(l.figuras,is);
			}
			else if (cad=="Poligono")
			{
				cad="";
				IDibujable* fig=UtilidadesSVG::crearFigura("Poligono",is);
				l.figuras.push_back(fig);
			}
		}
		catch (ExcepcionFiguraDesconocida& ex)
		{
			cerr<<ex.what();
		}
		
	}
	return is;      
}

ostream& operator<<(ostream& os,const Lienzo& l)
{
	char comilla = '"';
	
	os<<"<?xml version="<<comilla<<"1.0"<<comilla<<"?>"<<endl;
	os<<"<svg width="<<comilla<<l.getAncho()<<comilla<<" height="<<comilla<<l.getAlto()<<comilla<<endl;
	os<<"  version="<<comilla<<"1.2"<<comilla<<" baseProfile="<<comilla<<"tiny"<<comilla<<endl;
	os<<"  xmlns="<<comilla<<"http://www.w3.org/2000/svg"<<comilla<<">"<<endl;

	os<<"<desc>"<<l.titulo<<"</desc>"<<endl;
	int i=0;
	while(  i < (int)l.figuras.size())
	{
		if (l.figuras[i]->puedoPintarme() && !l.figuras[i]->isOculto())
		{
			l.figuras[i]->pintar(os);
			os<<endl;
		}
		i++;
	}
	os<<"</svg>"<<endl;
	return os;
}
